package com.cy.pj.notice.web.controller;

import com.cy.pj.notice.pojo.SysNotice;
import com.cy.pj.notice.service.SysNoticeService;
import com.cy.pj.notice.util.PageUtil;
import com.cy.pj.notice.web.pojo.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;

/**
 * 此对象为公告模块控制层处理器对象
 * 1.请求URL,请求方式设计
 * 1)条件查询   (请求方式Get，请求URL-"/notice/")
 * 2)新增公告   (请求方式Post，请求URL-"/notice/")
 * 3)基于ID查询 (请求方式Get，请求URL-"/notice/{id}")
 * 4)更新公告   (请求方式Put，请求URL-"/notice/")
 * 5)删除公告   (请求方式Delete，请求URL-"/notice/{id}")
 *
 * 2.请求参数设计
 * 1)参数传递方式
 * 1.1)将请求参数通过URL进行传递
 * 1.2)将请求参数通过请求体进行传递
 * 2)服务端接收请求参数
 * 2.1)直接量      (8种基本数据类型，字符串，日期)
 * 2.2)pojo对象   (提供和参数名对应的set方法)
 * 2.3)map对象    (@RequestParam或@RequestBody)
 * 3)方法参数描述
 * 3.1)@PathVariable    用于获取请求URL中{}内部的变量
 * 3.2)@RequestBody     用于获取请求体中JSON格式的数据
 * 3.3)@RequestParam    用于获取非JSON格式的请求参数数据
 * 3.4)@DateTimeFormat  用于设置可以接受的日期格式字符串
 *
 * 3.响应标准设计（状态，消息，数据）：JsonResult
 */
@RestController  // 相当于@Controller + @ResponseBody，其方法都已JSON格式输出，不用再写jackjson配置了
@RequestMapping("/notice/") // 请求URL：http://localhost/notice/  默认端口80，不用写
public class SysNoticeController {
    @Autowired
    private SysNoticeService sysNoticeService;

    @DeleteMapping("{id}")
    public JsonResult doDeleteNotice(@PathVariable Long... id){
//        try {
            return new JsonResult("delete OK",
                    sysNoticeService.deleteNotice(id));
//        }catch (Exception e){
//            e.printStackTrace();
//            return new JsonResult(e);
//        }
    }

    /**
     * 更新公告信息
     * @param notice 封装了公告信息的参数对象
     * @return
     */
    @PutMapping
    public JsonResult doUpdateNotice(@RequestBody SysNotice notice){
        return new JsonResult("update ok",
                sysNoticeService.updateNotice(notice));
    }

    /**
     * rest风格的url中允许使用变量（用{}括起来）
     * 用@PathVariable对方法参数描述，表示在方法参数中使用{}中的变量
     * @param id
     * @return
     */
    @GetMapping("{id}") //http://localhost/notice/1
    public JsonResult doSelectById(@PathVariable Long id){
        return new JsonResult("find by id = "+id,
                sysNoticeService.selectById(id));
    }

    /**
     * 新增公告信息
     * @param notice 封装客户端提交的公告信息，
     *               假如使用@RequestBody对参数进行描述，
     *               客户端可以向服务器传递JSON字符串（JSON序列化），
     *               服务端拿到以后，会将JSON字符串转为参数类型的对象（JSON反序列化）
     * @return
     * 注意：一个Controller方法中只能有一个参数使用@RequestBody注解描述
     */
    @PostMapping
    public JsonResult doInsertNotice(@RequestBody SysNotice notice){
        // JSON序列化
        return new JsonResult("save ok"+notice.getTitle(),
                sysNoticeService.insertNotice(notice));
    }
//    @RequestMapping("/find")
    @GetMapping
    public JsonResult doSelectNotices(SysNotice sysNotice) throws IOException {
//        PageInfo<SysNotice> pageInfo =
//                PageHelper.startPage(1, 5)
//                        .doSelectPageInfo(()-> {
//                        try {
//                            sysNoticeService.selectNotices(sysNotice);
//                        } catch (IOException e) {
//                            System.out.println("Service层的报错");
//                        }
//                        });

//        return new JsonResult("find ok", sysNoticeService.selectNotices(sysNotice));
        // 结果返回给调用方DispatcherServlet
        // 调用方拿到结果以后调用相关api将结果转换为JSON字符串（需要对象的get方法）
        // 最后通过Response响应对象将字符串响应到客户端

        return new JsonResult(PageUtil.startPage()
                .doSelectPageInfo(()->
                {
                    try {
                        sysNoticeService.selectNotices(sysNotice);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }));

    }

}
